﻿using System;
using System.Linq;
using StockholmsStad.Web.UI.Class.Interfaces;

namespace StockholmsStad.Web.UI.Class.Controller
{
    /// <summary>
    /// MVC Controller för bokningen
    /// </summary>
    public class DefaultPageController
    {
        private readonly IBookingModel _bookingModel;

        /// <summary>
        /// Modellen som kontrollern jobbar mot
        /// </summary>
        private readonly ILoginModel _loginModel;

        /// <summary>
        /// Skapar Controller och dess modell(er)
        /// </summary>
        public DefaultPageController(ILoginModel loginModel, IBookingModel bookingModel)
        {
            _loginModel = loginModel;
            _bookingModel = bookingModel;
        }

        ///<summary>
        /// Returnerar true om användaren redan har gjort en bokning innan inloggning
        ///</summary>
        public bool HasUnconfirmedBooking
        {
            get { return _loginModel.HasUnconfirmedBooking; }
        }

        /// <summary>
        /// Alla lediga tider som går att boka för en vigsel i stadshuset. Frågan går inte ned till server,
        /// utan propertien måste sättas explicit.
        /// </summary>
        public IOrderedEnumerable<DateTime> CachedFreeTimeblocksOrdinary
        {
            get { return _bookingModel.CachedFreeTimeblocksOrdinary; }
        }

        /// <summary>
        /// Initialiserar cachning av fria tider och upptagna dagar
        /// </summary>
        public void InitializeCachedTimeblocks()
        {
            try
            {
                _bookingModel.CachedFreeTimeblocksOrdinary =
                    _bookingModel.GetFreeTimeblocks(_loginModel.User, true).Select(t => t.StartDateTime).OrderBy(d => d.Ticks);
            }
            catch (Exception e)
            {
                throw (e);
            }
        }

        ///<summary>
        /// Skickar ett mail till användaren med det befintliga lösenordet
        ///</summary>
        ///<param name="email"></param>
        public void SendForgottenPassword(string email)
        {
            _loginModel.SendForgottenPassword(email);
        }

        public bool IsUserLoggedIn()
        {
            return _loginModel.User != null;
        }
    }
}